package com.wyx.config;

import com.wyx.ApplicationMerchantManagement;
import com.wyx.pojo.constant.ConfigRead;
import com.wyx.pojo.constant.Info;
import com.wyx.utils.StartBrowserUtil;
import com.wyx.utils.commonUtil.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import org.yaml.snakeyaml.Yaml;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 在这儿做的是 当项目快启动完成的时候做的事情，
 * 目前做了刷新一个bean的属性， 如果说刷新多个属性也能做，通过反射io等方式也可以，但是如果更加的合理的话就需要读懂spring的源码，  让他重新加载一下spring的bean，理论上来说是这样的。
 */
@Component
public class ProjectInitAfterConfig implements ApplicationRunner {
    @Autowired
    private ConfigRead configRead;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Info.initShanxiTobaccoCookieMap();
//        StartBrowserUtil.start2(configRead.getUrl());
        RealTimeUpdate();
    }

    /**
     * 实时更新配置文件
     */
    public void RealTimeUpdate() {
//        验证刷新bean
//        new Thread(() -> {
//            while (true) {
//                try {
//                    Thread.sleep(10000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println(configRead.getPort());
//            }
//
//        }).start();

        new Thread(() -> {
            long oldLastModif = 0;
            long newLastModif = 0;
            File file = null;
            file = FileUtil.getResourceFile("application.yml");
            long l = file.lastModified();
            oldLastModif = l;
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                file = FileUtil.getResourceFile("application.yml");
                newLastModif = file.lastModified();
                if (newLastModif > oldLastModif) {
                    // 加载YAML文件
                    InputStream resourceAsStream = ApplicationMerchantManagement.class.getResourceAsStream("/application.yml");
                    Map<String, Object> config = new Yaml().load(resourceAsStream);
                    configRead.setPort(String.valueOf((Integer) ((LinkedHashMap) config.get("server")).get("port")));
                    oldLastModif = newLastModif;
                    try {
                        resourceAsStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}
